00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef DDIRECT3D_HPP
00033 #define DDIRECT3D_HPP
00034
00035 #pragma comment(lib, "d3dx8")
00036
00037 #define DEDRIVER_DLL_EXPORTS
00038 #define USING_DESTINY3D
00039
00040
00041 #include <d3d8.h>
00042 #include <d3dx8.h>
00043 #include "Destiny3D.hpp"
00044 #include "deGlobalTypes.hpp"
00045
00046
00047 #include "deDriver_priv.hpp"
00048 #include "deList.hpp"
00049 #include "deHash.hpp"
00050
00051 static const long deD3D8_MAX_LIGHTS = 8;
00052
00053
00054 class deDirect3D8 : public deDriver
00055 {
00056 public:
00057
00058 deDirect3D8(long ID);
00059 ~deDirect3D8();
00060 long Release();
00061 deBoolean Init(HWND WindowHandle);
00062
00063
00064 const deDriverCaps* GetCaps(long Adapter) const;
00065 long GetAdapterCount() const;
00066 long GetModeCount(long Adapter) const;
00067 deBoolean WindowedAllowed(long Adapter) const;
00068
00069
00070 deBoolean SetDisplay(deDisplay *Display);
00071 deBoolean Reset(deDisplay *Display = NULL);
00072 deBoolean GetCurrentDisplay(long Adapter, deDisplay * Display) const;
00073 deBoolean GetDisplayMode(long Adapter, long Mode, deDisplay *Display) const;
00074 deBoolean ValidFormat(long Adapter, Resource ResourceType, BPP BPPType, ZPP ZPPType, BPP FrontBuffer, long ExtraFlag) const;
00075
00076
00077 deBoolean AddVertexBuffer(IdeVertexBuffer *Vertex);
00078 deBoolean RemoveVertexBuffer(IdeVertexBuffer *Vertex);
00079 deBoolean UpdateVertexBuffer(IdeVertexBuffer *Vertex);
00080
00081
00082 deBoolean AddShader(IdeShader * Shader);
00083 deBoolean SetShader(IdeShader * Shader);
00084 deBoolean RemoveShader(IdeShader * Shader);
00085
00086
00087 deBoolean BeginFrame();
00088 deBoolean EndFrame();
00089 deBoolean ClearFrame(deARGB Color, deBoolean ClearTarget, deBoolean ClearZBuffer, deBoolean ClearStencil);
00090 deBoolean Render(IdeVertexBuffer *Vertex, long IndexOffset, IdeVertexBuffer *IndexOverride);
00091
00092
00093 deBoolean SetViewport(long X, long Y, long Width, long Height, float MinZ, float MaxZ);
00094 deBoolean SetDepthRange(deFloat MinZ, deFloat MaxZ);
00095 deBoolean SetFOVClipping(float FOVY, float Aspect, float ClipNear, float ClipFar);
00096 deBoolean SetOrthoClipping(float Width, float Height, float ClipNear, float ClipFar, deBoolean Invert);
00097 deBoolean SetFOVClippingSubRect(deFloat FOVY, deFloat Aspect, deFloat ClipNear, deFloat ClipFar, deRect SubRect);
00098 deBoolean SetFOVClippingSubRectFloat(deFloat FOVY, deFloat Aspect, deFloat ClipNear, deFloat ClipFar, deFloatRect SubRect);
00099 deBoolean SetOrthoClippingSubRect(deFloat Width, deFloat Height, deFloat ClipNear, deFloat ClipFar, deBoolean Invert, deRect SubRect);
00100 deBoolean SetOrthoClippingSubRectFloat(deFloat Width, deFloat Height, deFloat ClipNear, deFloat ClipFar, deBoolean Invert, deFloatRect SubRect);
00101
00102
00103 deBoolean SetCameraTransform(deTransformInfo *M);
00104 deBoolean SetCameraTransform(deVertex *Eye, deVertex *At, deVertex *Up);
00105 deBoolean SetCameraTranslation(deVertex *Translation);
00106 deBoolean SetCameraRotation(deVertex *Rotation);
00107 deBoolean ResetCameraIdentity();
00108
00109
00110 deBoolean SetWorldTransform(deTransformInfo * Mat);
00111 deBoolean SetWorldTransform(deVertex *Eye, deVertex *At, deVertex *Up);
00112 deBoolean SetWorldTranslation(deVertex *Translation);
00113 deBoolean SetWorldRotation(deVertex *Rotation);
00114 deBoolean ResetWorldIdentity();
00115
00116 deBoolean SetTextureTransform(long StageNum, deTransformInfo * Mat);
00117
00118
00119 deBoolean AddBitmap(IdeBitmap *Bitmap);
00120 deBoolean AddBitmapProxy(IdeBitmapProxy *BitmapProxy);
00121 deBoolean RemoveBitmap(IdeBitmap *Bitmap);
00122
00123
00124 deBoolean RenderTo(IdeBitmap *Bitmap, long CubeMapFace);
00125 deBoolean ScreenShot(IdeBitmap * &pBitmap, deBoolean GrabWindow);
00126 deBoolean GetVideoTexture(IdeBitmap* pBitmap, long CubeMapFace);
00127
00128
00129 unsigned long GetRenderState(RenderState State);
00130 deBoolean SetRenderState(const IdeRenderState *State);
00131 deBoolean SetRenderState(RenderState State, unsigned long Value);
00132 deBoolean EnableLight(long LightID, deBoolean Enable);
00133 deBoolean DisableAllLights();
00134
00135
00136 deDriverInfo* GetInfo() const;
00137 IdeDriver::Types GetType() const;
00138
00139 void InvalidateRenderStates(deBoolean Valid);
00140 private:
00141 struct VertexShaderEntry
00142 {
00143 long ID;
00144 unsigned long VertexShader;
00145 unsigned long * ShaderInfo;
00146 long BufferFlags;
00147
00148 };
00149 struct VertexBufferEntry
00150 {
00151 long ID;
00152 long EntrySize[IdeVertexBuffer::BUFFER_COUNT-1];
00153 LPDIRECT3DVERTEXBUFFER8 Buffers[IdeVertexBuffer::BUFFER_COUNT-1];
00154 LPDIRECT3DINDEXBUFFER8 IndexBuffer;
00155 D3DPRIMITIVETYPE RenderType;
00156 long PointCount;
00157 long TriCount;
00158 long IndexCount;
00159 long PointStart;
00160 long IndexStart;
00161 long FrameUsed;
00162 deBoolean SubBuffer;
00163 };
00164
00165 struct TextureEntry
00166 {
00167 long ID;
00168 long NumFaces;
00169 long FrameUsed;
00170 LPDIRECT3DBASETEXTURE8 Texture;
00171 LPDIRECT3DSURFACE8 DepthStencil;
00172 };
00173
00174
00175 static long s_AdapterCount;
00176 static int * s_ModeCount;
00177 static deBoolean * s_WindowPossible;
00178 static HINSTANCE s_libD3D8;
00179 static LPDIRECT3D8 s_D3D;
00180 static D3DCAPS8 * s_DevCaps;
00181 static deDriverCaps* s_Caps;
00182 static long s_NumDevices;
00183
00184
00185 IDirect3DDevice8 * m_D3DDevice;
00186 long m_AdapterNum;
00187
00188
00189 deBoolean m_DeviceLost;
00190 deBoolean m_RenderStatesValid;
00191 deTList <VertexShaderEntry> m_ShaderList;
00192 unsigned long m_LastShader;
00193 deBoolean m_TextureRendered;
00194 deBoolean m_LightsEnabled[deD3D8_MAX_LIGHTS];
00195 IdeRenderTexture* m_CachedTexture;
00196 long m_FrameNum;
00197
00198
00199 D3DMATRIX m_WorldMatrix;
00200 D3DMATRIX m_CameraMatrix;
00201
00202
00203 IdeRenderMaterial::MatSource_t m_AmbientSource, m_EmissiveSource;
00204 IdeRenderMaterial::MatSource_t m_DiffuseSource, m_SpecularSource;
00205 deTHashInt <IdeBitmap*> m_TexturesList;
00206 deTHashInt <IdeVertexBuffer*> m_VBufferList;
00207 LPDIRECT3DSURFACE8 m_pZBuffer;
00208 IdeBitmap* m_pCurrentTarget;
00209
00210
00211 void ReportErrorHR(HRESULT hr);
00212 deBoolean TestDeviceStatus(deBoolean * DeviceCanReset);
00213 deBoolean ResetDevice(D3DPRESENT_PARAMETERS *D3DParams);
00214 deBoolean ReleaseVideoMemResources();
00215 deBoolean BuildD3DParams(deDisplay * Display, D3DPRESENT_PARAMETERS *D3DParams);
00216
00217 deBoolean SetTextureState(IdeRenderTexture *State);
00218 deBoolean SetLightState(IdeRenderLight *State);
00219 deBoolean SetMaterialState(IdeRenderMaterial *State);
00220
00221 deBoolean FillBufferInfo(VertexBufferEntry *BufferEntry, IdeVertexBuffer *Vertex, IdeVertexBuffer::BufferType BufferType, deBoolean WipeBuffer);
00222 deBoolean ProcessVertexBuffer(IdeVertexBuffer *Vertex, VertexBufferEntry *VertexBufferInfo, long BufferFlags);
00223
00224 deBoolean CreateDefaultCachedTexture();
00225
00226
00227 VertexShaderEntry * GetFixedFunctionShader(IdeVertexBuffer *Vertex);
00228 VertexShaderEntry * LookUpFFShader(long BufferFlags) const;
00229 VertexShaderEntry * MakeFFShader(long BufferFlags);
00230 long DeleteShaders();
00231
00232 D3DFORMAT ToD3DBPP(IdeDriver::BPP BPPType) const;
00233 IdeDriver::BPP FromD3DBPP(D3DFORMAT BPPType) const;
00234 D3DFORMAT ToD3DZPP(IdeDriver::ZPP ZPPType) const;
00235 IdeDriver::ZPP FromD3DZPP(D3DFORMAT ZPPType) const;
00236 D3DMATERIALCOLORSOURCE ToD3DMatSource(IdeRenderMaterial::MatSource_t source) const;
00237 };
00238
00239 char* __cdecl HR2String(HRESULT hr, char* szHR);
00240
00241 extern "C"
00242 {
00243
00244 #ifdef _DEBUG
00245 __declspec(dllexport) deBoolean IsDestiny3DDriverDebug();
00246 #else
00247 __declspec(dllexport) deBoolean IsDestiny3DDriver();
00248 #endif
00249 __declspec(dllexport) IdeDriver *GetDriverInstance(long ID);
00250 __declspec(dllexport) const deDriverInfo *GetDriverInfo(long StructSize);
00251 };
00252
00253 #endif